Amazon Machine Learningを利用したコンテンツの出し分け #アドカレ2015
アプリを作っている時にお客様から年代に応じたコンテンツの出し分けをしたいと依頼された場合、どうやって実現すればいいでしょうか。今回はAmazon Machine Learning(Amazon ML)を利用してコンテンツの出し分けを実装する方法について紹介したいと思います。なお、今回はAWSモバイルのアドベントカレンダーということもあり、普段モバイルアプリの開発は行っているが、機械学習については特に予備知識が無い方を対象として記述しています。
シナリオ
ここでは仮にA社がモバイルアプリをリリースしており、アプリ上でA社のグッズを販売する機能があると仮定します。またアプリには会員登録機能があり、生年月日の入力欄がありますが必須入力項目ではないとします。ここでは約半数の会員が生年月日を入力していたものとします。そのため、約半数の会員については年代が生年月日から算出できますが、残りの約半数の会員については年代が不明となります1。
A社でグッズの販売傾向を分析した所、年代に応じて購入するグッズに違いがあるという結果になりました。そのため、アプリに年代に応じたコンテンツの出し分け機能を実装することになりました。
ですが、生年月日を入力していない会員もいるため、何らかの方法で会員の年代を予測する必要が出てきました。このような場合にAmazon MLが利用できます。
どのように年代を予測するか
今回のケースでは年代毎にコンテンツの出し分けをしたいので、アプリケーション的に考えると年代を予測するAPIを作成すればいいわけです。会員情報を参照して生年月日が登録されている場合はその値から年代を算出し、登録されていない場合は年代予測APIを利用して年代を取得します。
ルールベースによるアプローチ
では年代予測APIを作成するように依頼された場合、どうやって実装すればいいでしょうか?戻り値は年代でいいとして、引数と内部の判定ロジックをどのように記述すればいいでしょうか。例えばBというグッズを購入する会員は40代が多いということが分かっている場合は、引数を会員IDとし内部でグッズBの購入の有無をチェックするif文を記述して判定するという方法も考えられます。そして年代ごとに判定するルールと優先度を仕様としてまとめることが出来るならば条件分岐を利用して年代予測APIを実装することができます。このようにルールに基づいて判定する手法をルールベースと言ったりします。
function predictAgeRange(memberId) { if (isTeen(memberId) { return "10代"; } else if (isTwenties(memberId)) { return "20代"; } ... // 以下略 }
なお、グッズBを購入する会員は40代が多いと書いたように、必ずしもグッズBを購入したからといって40代だとは限りません。あくまでも販売傾向を分析した結果グッズBを購入する会員は40代が多いので、グッズBを購入した会員は40代とみなすという仕様にしただけです。
機械学習によるアプローチ
先程はグッズの購入傾向から年代を判定するという仕様を考えましたが、もしあなたが年代を予測するように依頼されたらどのようなデータから年代を推測するでしょうか。例えば、アクセスログが手元にあったとしたら、年代ごとにアクセスするページに偏りがないか調査するかもしれません。年代に応じて購買力が変わることも考えられますので、年間の購入金額で推測するという方法も考えられます。
このようにある予測を行う際に利用できそうな情報はいろいろ考えられます。そして、その全てのデータについて分析を行い年代を予測するルールを作成するのは大変な作業になります。そこで機械学習を利用します。
年代予測APIの作り方
機械学習を利用することで判定ルールを機械に作らせることができます。年代の判定をAmazon MLで行う場合は多項分類モデルを作成することで年代予測APIを作成することができます。モデルというのは機械学習によって作成した判定ルールを指します。例えば10代、20代、30代といういうように年代は3つ以上考えられます。このように予測対象が3つ以上ある場合に利用するのが多項分類です。同じように性別のような予測対象が2つの場合を二項分類といいます。他には気温や売上のような数値を予測するものとして回帰があります。その他にもクラスタリングや決定木など色々あります。
Amazon MLで予測APIを作成する流れ
まず販売履歴テーブルやアクセスログを会員ごと単位に集計したCSVファイルを作成します。後はこのCSVファイルをS3にアップロードすればAWSのマネジメントコンソール上で何度かボタンをクリックするだけで年代予測APIを作成することができます。
- モデルを作成および評価するためのCSVファイルを用意する
- CSVファイルからモデルを作成する
- 作成したモデルを評価する
- APIを有効化する
モデルを作成および評価するためのCSVファイルを用意する
予測したい対象が会員の年代となるため、会員単位に情報を集約したCSVファイルを作成します。CSVファイルには予測対象となるカラムとその判断材料となりそうなカラムを複数入れることになります。今回だと以下の様なカラムが考えられます。
- 年代:予測対象となるカラム
- グッズ毎の購入個数:グッズA、グッズB、グッズCとグッズ毎の購入個数をそれぞれ別カラムとして用意する
- ページのアクセス回数:ページX、ページY、ページZとページ毎のアクセス回数をそれぞれ別カラムとして用意する
- 年間の購入金額:グッズ横断で年間の購入金額を合計した値
CSVファイルは以下の様なイメージになります。
age_range, item_a, item_b, item_c, page_a, page_b, page_c, total_purchase_price 10, 0, 1, 3, 3, 5, 1, 1000 20, 1, 4, 2, 7, 5, 3, 2000 10, 8, 2, 1, 5, 2, 7, 3000 40, 4, 1, 3, 2, 5, 2, 1500
このように機械学習では予測対象のカラムを集計軸として判断材料となるカラムを複数用意します。グッズやページ毎にカラムを用意することもあるため判断材料となるカラムが数百個になることもあります。なお、予測対象となるカラムのことを目的変数といい、判断材料となるカラムのことを説明変数といいます。
- 目的変数:予測対象となるカラム。単一。APIの戻り値に相当する。
- 説明変数:判断材料となるカラム。通常は複数。APIの引数となる。
では実際にどうやってCSVファイルを作成すればよいのか考えてみましょう。今回のシナリオは会員情報に生年月日を登録している会員のデータを利用して、生年月日を登録していない会員の年代を予測します。そのため、まず会員情報テーブルで生年月日を登録している会員のみがCSVファイルの抽出対象となります。次に、販売履歴テーブルから会員を集約キーとしてグッズ毎の購入個数を抽出します。ただし、グッズの種類が多い場合はデータ分析をして説明変数として利用するグッズを絞り込んだり、グッズをカテゴリーで集約するなどの検討が必要になるかもしれません。更にアクセスログは通常のシステムであればデータベースに保存していないでしょうから、ログファイルを直接集計することも考えられますし、販売履歴テーブルと同様にどのページヘのアクセス数を説明変数として利用するかの検討も必要になるかもしれません。
というように、モデルを作成するためのCSVファイルの作成はかなり手間がかかる作業です。グッズ毎の購入個数のような非正規化したデータは帳票用のデータベースでなければ通常は入れていないでしょうし、アクセスログを全件データベースに入れるようなこともしないと思います。そのため、機械学習を利用しようとした際にデータが無かったり、データはあっても機械学習で利用できる形にするためのコストがかかる場合はよくあるので注意して下さい。
CSVファイルからモデルを作成する
CSVファイルができたらS3にアップロードします。後はAWSのマネジメントコンソール上でボタンを何度かクリックするだけでモデルが作成できます。手順の詳細については割愛します。以下をご参照下さい。
- Tutorial: Using Amazon ML to Predict Responses to a Marketing Offer - Amazon Machine Learning:AWS公式ドキュメントに記載されているチュートリアルです。
- 【新サービス】Amazon Machine Learningを試してみた #AWSSummit #AmazonML | Developers.IO:前述のチュートリアルを試してみた弊社ブログエントリーです。
- (レポート) BDT302: Amazon Machine Learningを使ったリアルワールドスマートアプリケーション #reinvent | Developers.IO:AWSのTwitterアカウントでメンションに反応すべきかどうかを判定するモデルを作ったセッションのレポートです。ソースコードもGitHubで公開されているので実際にアプリケーションを作成する際の参考になるかと思います。
作成したモデルを評価する
モデルがどの程度正しく予測できるのか評価します。どの程度正しく予測できるのかを精度と言ったりしますが、精度が期待する値よりも低い際は説明変数の選定からやり直しになります。
手順の詳細は前節で紹介したチュートリアルをご参照下さい。また、モデル毎に評価指標は異なりますので詳細は以下のブログエントリーをご参照下さい。
APIを有効化する
モデルが作成済みであればAWSのマネジメントコンソール上でAPIを有効化するボタンをクリックするだけでAmazon MLはAPIを作成することができます。
- マネジメントコンソール上でAmazon Machine Learningのリアルタイム予測を試せるようになりました | Developers.IO:有効化する前にマネジメントコンソール上でAPIを試すことが出来る機能についての紹介です。
- Amazon Machine Learning + AWS Lambda + API Gateway でリアルタイム予測APIを構築する | Developers.IO:Amazon MLのAPIをAPI GatewayとAWS Lambdaでラップした例です。
実際の導入に向けて
あくまでも予測であるため、通常は100%正しく予測できません。そのため、外れることがあってもその機能がないよりはある方が効果があるから実装するという割り切りが必要です。また、モデルは定期的に更新する必要があります。例えばグッズの入れ替えも考えられますし、ページ構造の変更も考えられます。
その他にも色々と考えられますが、まずは実際に触ってから必要に応じて調べるという形が良いのではないかと考えます。
まとめ
ということでAmazon MLの紹介でした。今回のエントリーを見て、機械学習を利用することに興味を持ってもらえたら嬉しいです。
明日(12月15日)は、清田 隆志さんの Serverless(JAWS) & Slack Slash Commands についての記事です。お楽しみに!
- もちろん、入力していてもその値が本当の生年月日ではない可能性もありますが、ここでは概ね正確に入力されているとこととします。 ↩